package com.ywk.base.designPattern.observer.myObserver;

/**
 * 观察者模式：有观察者（一个或者多个）和被观察者（一个），当被观察者状态发生变化的时候，就会去通知它的所有的观察者，然后由观察者根据被观察者的情况
 * 作出反应。观察者模式属于行为型模式。
 *
 * 角色：
 * Subject：被观察者的抽象接口，在这个接口里面，提供添加观察者和删除观察者、通知观察者的方法。
 * ConcreteSubject：具体的被观察者，Subject 的实现类。在具体的内部发生改变时，给所有注册过的观察者发送通知。
 * Observer：观察者的抽象接口，在这个接口里面定义了一个更新方法，当收到被观察者的通知的时候就更新。
 * ConcreteObserver：具体的观察者，Observer 的实现类。实现 Observer 的更新方法。
 *
 * 案例：
 * 送奶工就可以看做是一个被观察者，然后订奶的张三、赵四、王五就是观察者（观察送奶工有没有来），送奶工来送奶会通知各位观察者，通知他们来取奶。这个
 * 时候某六也想订奶，就可以告诉送奶工，以后他也要订奶了，以后来送奶的时候就也会通知某六了。
 *
 * 参考：https://www.jianshu.com/p/a03d0cf986ef
 *
 * @Author zbh
 * @Date 2023/4/3
 */
public class ObserverTest {

    public static void main(String[] args) {
        // 创建被观察者
        Subject subject = new ConcreteSubject("aaa");
        // 创建观察者
        Observer one = new ConcreteObserver("张三",subject);
        // 创建观察者
        Observer two = new ConcreteObserver("赵四",subject);
        // 创建观察者
        Observer three = new ConcreteObserver("王五",subject);
        // 状态发生改变，通知观察者
        subject.notifyObserver();
    }
}
